iT邦幫忙

2024 iThome 鐵人賽

DAY 14
1
Python

使用 WiFiBoy Python 玩學機來學物聯網應用 系列 第 14

14. 連接 MAX7219 LED 矩陣顯示模組

  • 分享至 

  • xImage
  •  

max7219 簡介

MAX7219 的特點:

  • 序列介面:MAX7219 使用 SPI (Serial Peripheral Interface) 傳輸協議,透過一個 3 線式序列介面連接 LED 顯示模組。
  • 低功耗:耗電量低,可以適用於只能電池供電的應用場景。
  • 可多模組串聯使用: 多個 MAX7219 模組可以串聯,驅動更大的顯示模組(例如 8x16, 16x16 等)。
  • 亮度控制: 內建亮度控制功能,可設定亮度分段。
  • 容易程式控制: 提供資料與位址暫存器,讓開發者可以輕鬆地控制顯示效果。

主要接腳

  • VCC:電源正極,通常為 5V。
  • GND:電源正極。
  • DIN:資料輸入腳位,用來接收控制器發送的資料。
  • CS (Chip Select):晶片選擇腳位,當其為低電壓時,MAX7219 晶片啟動。
  • CLK:時鐘信號腳位,用於同步資料傳輸使用。
  • DOUT:資料輸出腳位,用來連接下一組 MAX7219 模組。

SPI 傳輸協定介紹

對 SPI 傳輸協訂有興趣的讀者,可以參考 JIMI 陪你玩 ROBOT_SPI Function 205 的教學

CS:Chip Select,當 Master 要與目標裝置溝通時,會將將該腳位拉成 LOW,訊息開始傳輸,結束後會將 CS 腳位拉成 HIGH,結束通訊。也就因 SPI 是透過 CS 來『確定』與那個裝置溝通,所以當系統上的裝置越多,CS 線路也就越多(MOSI、MISO、CLK仍共用)。
MOSI:英文為 Master Output Slave Input,也就是控制器發出訊息與 Slave 接收訊息的資料線。
MISO:英文為 Master Input Slave Output,此條線路為控制器接收來自 Slave 裝置訊息用。
CLK:Clock 線路,MOSI 或 MISO 資料線的參考時脈。

針對 WiFiBoy Python IoT 玩學機,您應該如此接線:

  • VCC 對應 Pin1(USB 5V)
  • GND 對應 Pin2(GND)
  • DIN 對應 Pin10(GPIO 23) --> VSPI MOSI 介面
  • CLK 對應 Pin8(GPIO 18) --> VSPI CLK 介面
  • CS 對應 PIN5(GPIO 5)

WiFiBoy 接線圖

常見應用

  • 滾動文字數字(跑馬燈)。
  • 顯示簡單的圖案或是點陣動畫。
  • 計數器。

MicroPython 常用的 max7219 驅動程式簡介

在 MicroPython 1.23 的版本中,沒有內建驅動 max7219 的模組。在 github 上就有一個經常被 maker 引用的專案可以使用。

我們要把專案裡面的 max7219.py 下載下來,上傳到玩學機的 Flash。我們會習慣把外部引入的函式庫放到 lib 目錄中。請在根目錄建立一個 lib 目錄,然後將 max7219.py 黨放進去。

未來我們引用裡面的函數就只要寫底下這行,就可以用裡面內建的方法了:

from lib.max7219 import Matrix8x8 

看懂 max7219.py 內建的範例

驅動程式的教學說明其實很簡略,經過筆者實際測試後,發覺需要經歷過三個階段:

  1. 先搞定 MAX7219 與玩學機的接線(因為驅動程式說明文件並無介紹 WiFiBoy 的接線方法)
  2. 了解如何啟用 WiFiBoy 的 SPI 功能,讓驅動程式可以正常工作。
  3. 自行輸入教學範例程式,了解繪圖語法運作規則。
  4. 查閱 max7219.py 原始碼,了解函數提供的相關方法。

WiFiBoy 有兩組 SPI 介面,不過第一組已經被內建的 LCD 使用,所以我們啟動 SPI 傳輸介面時要使用 第二組。這點非常重要,當初在寫測試程式時,花了很多時間在查文件。

繪圖語法規則,可以參考本日文章的後半段範例教學的註解說明。

我們先列出原始碼中,內建的相關方法:

  • 填入顏色 self.fill = fb.fill # (col)
  • 在指定座標畫點 self.pixel = fb.pixel # (x, y[, c])
  • 在指定座標畫水平線 self.hline = fb.hline # (x, y, w, col)
  • 在指定座標畫垂直線 self.vline = fb.vline # (x, y, h, col)
  • 在指定兩點座標畫直線 self.line = fb.line # (x1, y1, x2, y2, col)
  • 在指定座標一長寬畫空心矩形 self.rect = fb.rect # (x, y, w, h, col)
  • 在指定座標一長寬畫實心矩形 self.fill_rect = fb.fill_rect # (x, y, w, h, col)
  • 在指定座標輸出字串 self.text = fb.text # (string, x, y, col=1)
  • 卷軸 self.scroll = fb.scroll # (dx, dy)
  • 輸出記憶體內容 self.blit = fb.blit # (fbuf, x, y[, key])
  • 初始化 self.init()

範例說明

# MAX7219 8x8 LED display Github 專案教學範例講解
# https://github.com/mcauser/micropython-max7219
# 初始設定,以 WiFiBoy 為例
from machine import Pin, SPI
import lib.max7219
from utime import sleep
# 定義接腳
CLOCK_PIN = 18
DATA_PIN = 23
CS_PIN = 5
# 初始化 SPI
spi0 = SPI(2, baudrate=10000000, polarity=0, phase=0, sck=Pin(CLOCK_PIN), mosi=Pin(DATA_PIN))
# 初始化 CS 腳位
cs = Pin(CS_PIN, Pin.OUT)
# 初始化 MAX7219 LED 矩陣
# ===============================================================
# 範例開始 
# ===============================================================
# 我們使用四個串聯在一起的 MAX7210 模組,參數要設定為4
display = lib.max7219.Matrix8x8(spi0, cs, 4)  
# ===============================================================
# 01. 顯示 12345678 在 (0, 0) 座標
# ===============================================================
# 因為只有四個模組,所以只會顯示1234。在(0,0)座標畫,最後一個1是點亮 LED
# display.text('12345678',0,0,1)                
# ===============================================================
# 02. 關閉整個 LED ,即填入0 值
# ===============================================================
# display.fill(0)
# ===============================================================
# 03. 畫個 V 字
# ===============================================================
# display.pixel(0,0,1)
# display.pixel(1,1,1)
# display.pixel(2,2,1)
# display.pixel(3,1,1)
# display.pixel(4,0,1)
# ===============================================================
# 04. 畫水平與垂直線
# ===============================================================
# 因為我們使用四塊水平串聯,所以x軸有32點
# display.hline(0,4,32,1)                        
# display.vline(4,0,8,1)
# ===============================================================
# 05. 畫空心與實心矩形
# ===============================================================
# 在(17, 1) 這點畫一個邊長 6 點的空心正方形(座標從(0,0)開始)
# display.rect(17,1,6,6,1)
# 在(25, 1) 這點畫一個邊長 6 點的實心正方形
# display.fill_rect(25,1,6,6,1)                 
# ===============================================================
# 06. 顯示文字 Play
# ===============================================================
# display.fill(0)
# display.text('Play',0,0,1)
# ===============================================================
# 07. 文字捲動
# ===============================================================
# display.fill(0)
# display.text('12345678',0,0,1)
# display.scroll(-8,0)           # 2344
# display.show()                 # 輸出 buffer 內容即繪出畫面。

實作範例

製作一個能顯示英文數字的跑馬燈

# Max7219 範例_HelloWorld跑馬燈
from machine import Pin, SPI
import lib.max7219
from utime import sleep

CLOCK_PIN = 18
DATA_PIN = 23
CS_PIN = 5

spi0 = SPI(2, baudrate=10000000, polarity=0, phase=0, sck=Pin(CLOCK_PIN), mosi=Pin(DATA_PIN))
cs = Pin(CS_PIN, Pin.OUT)

matrix = lib.max7219.Matrix8x8(spi0, cs, 4)

# 顯示字串函數
def clear_display():
    # 清除顯示內容
    matrix.fill(0)
    matrix.show()

def show_text(text, delay=0.1):
    text_width = len(text) * 8
    clear_display()
    for offset in range(text_width + 32):  # 32 是為了讓文字全部移出螢幕
        clear_display()
        for i in range(len(text)):
            char = text[i]
            # 計算字在螢幕上的起始位置
            char_x = (i * 8) - offset
            if -8 < char_x < 128:  # 只顯示螢幕內的字串
                matrix.text(char, char_x, 0, 1)
        matrix.show()
        sleep(delay)

# 執行跑馬燈程式
try:
    while True:
        show_text("Hello, WiFiBoy!")
except KeyboardInterrupt:
    clear_display()

參考資料

  1. | ESP32 教學 | MicroPython | SPI Function | 205 |
  2. | ESP32 教學 | MicroPython | Max7219 SPI Module | 206 |
  3. MicroPython MAX7219 8x8 LED Matrix

上一篇
13. 四位數七段顯示器應用
下一篇
15. 控制 LCD1602 液晶顯示器
系列文
使用 WiFiBoy Python 玩學機來學物聯網應用 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言